package com.huan.social.qq.connect;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.social.oauth2.AccessGrant;
import org.springframework.social.oauth2.OAuth2Template;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.StandardCharsets;

/**
 * 用于走完 oauth2 流程
 *
 * @author huan.fu
 * @date 2018/9/25 - 11:48
 */
@Slf4j
public class QqOauthTemplate extends OAuth2Template {

	public QqOauthTemplate(String clientId, String clientSecret, String authorizeUrl, String accessTokenUrl) {
		super(clientId, clientSecret, authorizeUrl, accessTokenUrl);
		// 设置为true，将客户端凭证作为参数传递给提供者，而不是使用HTTP基本身份验证 createRestTemplate() 此方法中如果useParametersForClientAuthentication=false将会使用basic认证
		setUseParametersForClientAuthentication(true);
	}

	/**
	 * 因为 spring social 中默认实现返回的是 json ,而实际上 qq 返回的并不是,因此需要重写该方法
	 *
	 * @param accessTokenUrl
	 * @param parameters
	 * @return
	 */
	@Override
	protected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {
		String accessTokenStr = getRestTemplate().postForObject(accessTokenUrl, parameters, String.class);
		log.info("获取到的accessToken响应:[{}]", accessTokenStr);
		String[] items = StringUtils.splitByWholeSeparatorPreserveAllTokens(accessTokenStr, "&");
		String accessToken = StringUtils.substringAfterLast(items[0], "=");
		Long expiresIn = new Long(StringUtils.substringAfterLast(items[1], "="));
		String refreshToken = StringUtils.substringAfterLast(items[2], "=");
		return new AccessGrant(accessToken, null, refreshToken, expiresIn);
	}


	@Override
	protected RestTemplate createRestTemplate() {
		RestTemplate restTemplate = super.createRestTemplate();
		restTemplate.getMessageConverters().add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
		return restTemplate;
	}
}
